package com.cskaoyan.service.wx.impl;

import com.cskaoyan.bean.MarketAddress;
import com.cskaoyan.bean.MarketAddressExample;
import com.cskaoyan.bean.MarketUser;
import com.cskaoyan.bean.param.CommonData;
import com.cskaoyan.mapper.MarketAddressMapper;
import com.cskaoyan.service.wx.WXAddressService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author :rain
 * @description
 * @since 2022/06/28 21:51
 */
@Service
public class WXAddressServiceImpl implements WXAddressService {

    @Autowired
    MarketAddressMapper addressMapper;

    /**
     * 获取所有的地址信息
     *
     * @param currentUser 当前正在登陆的用户
     * @return
     */
    //TODO 此处需要当前登录用户的信息
    @Override
    public CommonData<MarketAddress> queryAdressInfo(MarketUser currentUser) {
        MarketAddressExample marketAddressExample = new MarketAddressExample();
        MarketAddressExample.Criteria criteria = marketAddressExample.createCriteria();
        //默认显示的为deleted为false的信息
        criteria.andDeletedEqualTo(false);
        //TODO 获取当前用户的id
        criteria.andUserIdEqualTo(currentUser.getId());
        List<MarketAddress> marketAddresses = addressMapper.selectByExample(marketAddressExample);
        PageInfo<MarketAddress> pageInfo = new PageInfo<>(marketAddresses);
        return CommonData.data(pageInfo);
    }

    /**
     * 根据地址信息的id获取用户所有的地址信息
     *
     * @param id
     * @return
     */
    @Override
    public MarketAddress queryByAddressId(Integer id) {

        MarketAddress address = addressMapper.selectByPrimaryKey(id);

        return address;
    }

    /**
     * 新增和修改为同一个方法，需要先判别是新增还是修改
     * 通过请求的参数的id先获取当前的对象，若当前对象为空，说明并没有这个信息，执行新增操作，若有执行修改操作
     * 在新增的时候，需要判别是否为默认地址，若携带默认地址，则需要将数据库中的默认地址都置为false，若不是，直接执行新增操作
     * 在修改的时候，也需要判别是否为默认地址，是默认地址，将数据库中的默认地址都置为false，再执行修改操作
     * 需要获取当前用户的id
     * 默认值地址值只有一个，需要判别
     *
     * @param address     请求对象
     * @param currentUser 当前正在登录的用户
     * @return
     */
    @Override
    public Integer updateAddressInfo(MarketAddress address, MarketUser currentUser) {
        //通过id获取当前的对象信息
        MarketAddress marketAddress = addressMapper.selectByIdGetAddressInfo(address.getId());
        //说明并未查到当前的地址信息，说明需要新增
        if (marketAddress == null) {
            address.setAddTime(new Date());
            address.setUpdateTime(new Date());
            //TODO 需要将当前用户的id Set进去进行封装
            address.setUserId(currentUser.getId());

            //判断当前的isdefault是否为true，若为true，需要将别的都置为false
            Boolean isDefault = address.getIsDefault();
            //isDefault为true
            if (isDefault) {
                //直接将当前数据库的所有的is_defualt置为false
                addressMapper.updateByIsDefault(false);
                //将判断条件置反
                isDefault = false;
            }
            //上述修改完成后，当前数据库中没有默认地址了，执行插入操作
            int affact = addressMapper.insertSelective(address);
            //说明新增失败
            if (affact == 0) {
                return null;
            }
            //返回的是更新后的地址的id
            return address.getId();
        }

        //TODO 如果默认为true执行更新操作
        //获取当前请求参数中的默认地址是否为true
        Boolean adressDefault = address.getIsDefault();
        if (adressDefault) {
            //TODO 需要判别当前列表里的为true的对象，将其设置为false
            //直接将当前数据库的所有的is_defualt置为false
           addressMapper.updateByIsDefault(false);
            //将判断条件置反
            adressDefault = false;
        }
        //将正确的用户id封装
        address.setUserId(currentUser.getId());
        address.setUpdateTime(new Date());
        int affactRows = addressMapper.updateByPrimaryKeySelective(address);
        if (affactRows == 0) {
            return null;
        }
        //如果修改成功,返回修改地址的id
        return address.getId();
    }


    /**
     * 根据id删除当前地址信息
     * @param address 封装的只有id
     * @return
     */
    @Override
    public Integer deleteById(MarketAddress address) {
        //假删除，将delete置为false
        address.setDeleted(true);
        int affactRows = addressMapper.updateByPrimaryKeySelective(address);
        if (affactRows == 0) {
            return null;
        }
        return affactRows;
    }


}

